"use strict";

import {app, crashReporter, session} from "electron";
import InitWindow from "./services/windowManager";
import disableButton from "./hook/disableButtonHook";
import {initTray} from "./services/trayManager";
import domains from "./config/domains";
import server from "./server";
import mainLog from "electron-log/main";

// 初始化日志系统
mainLog.initialize();
// 记录信息
if (!app.isPackaged) mainLog.info('应用启动');
//捕获崩溃报告
crashReporter.start({uploadToServer: false, ignoreSystemCrashHandler: false});

function onAppReady() {
	new InitWindow().initWindow();
	initTray();
	disableButton.disableF12();
	if (process.env.NODE_ENV === "development") {
		const {VUEJS_DEVTOOLS} = require("electron-devtools-vendor");
		session.defaultSession
			.loadExtension(VUEJS_DEVTOOLS, {
				allowFileAccess: true,
			})
			.then((r) => {
				console.log("已安装: vue-devtools");
			});

		//添加启动内置服务器
		server.StartServer().then((r) => {
			console.log("内置服务器已启动");
		});
	}
}

app.whenReady().then(onAppReady);

//禁止程序多开;需要单例锁的时候用
// const gotTheLock = app.requestSingleInstanceLock()
// if (!gotTheLock) {
// 	console.log("检测到应用单例锁")
// 	app.quit()
// }

//命令行开关
// 由于9.x版本问题，需要加入该配置关闭跨域问题
// app.commandLine.appendSwitch("disable-features", "OutOfBlinkCors");
//远程调试端口 TBD
// app.commandLine.appendSwitch("remote-debugging-port", '8888');
//输出日志 TBD
// app.commandLine.appendSwitch("enable-logging","file");

app.on("window-all-closed", () => {
	// 所有平台均为所有窗口关闭就退出软件
	app.quit();
});
app.on("browser-window-created", () => {
	console.log("window-created");
});
/**
 * 安全检查
 * 创建WebView前先检查内容来源
 */
app.on("web-contents-created", (event, contents) => {
	contents.on("will-attach-webview", (event, webPreferences, params) => {
		let isSafe = 0;
		domains.some((d) => {
			// 验证正在加载的 URL
			if (!params.src.startsWith(d)) {
				isSafe -= 1;
			}
		});
		if (isSafe < 0) {
			mainLog.log("main/index.ts提示 非安全访问")
			// 禁用 Node.js 集成
			// webPreferences.nodeIntegration = false;
			// event.preventDefault()
			// 如果未使用，则删除预加载脚本或验证其位置是否合法
			// delete webPreferences.preload
		}
	});
});

if (process.defaultApp) {
	if (process.argv.length >= 2) {
		app.removeAsDefaultProtocolClient("Hi-sass-frame");
		console.log("由于框架特殊性,开发环境下无法使用");
	}
} else {
	app.setAsDefaultProtocolClient("Hi-sass-frame");
}

//监听记录主程序错误
process.on('uncaughtException', (error) => {
	mainLog.error(error);
	// 发送崩溃报告或者保存日志
});

app.on('render-process-gone', (event, webContents, details) => {
	mainLog.warn("app:render-process-gone,", JSON.stringify(event), JSON.stringify(webContents), JSON.stringify(details));
});

app.on('child-process-gone', (event, details) => {
	mainLog.warn('app:child-process-gone', JSON.stringify(event), JSON.stringify(details));
});
